﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using JoyServer.Events;

namespace JoyServer
{
	/// <summary>
	/// タスクバーアイコンと右クリックメニューを出すためだけのフォーム。
	/// フォーム自体は画面に表示されない。
	/// </summary>
	public partial class FormMain : Form, IEventDispatcher
	{
		/// <summary>
		/// イベント発行用
		/// </summary>
		private EventDispatcher eventDispatcher;

		/// <summary>
		/// 設定画面のフォーム
		/// </summary>
		private FormConfig formConfig;

		/// <summary>
		/// イベント発行用
		/// </summary>
		/// <param name="type"></param>
		/// <param name="listener"></param>
		#region IEventDispatcher メンバ

		public void addEventListener(string type, EventFunction listener)
		{
			eventDispatcher.addEventListener(type, listener);
		}

		public void removeEventListener(string type, EventFunction listener)
		{
			eventDispatcher.removeEventListener(type, listener);
		}

		public bool hasEventListener(string type)
		{
			return eventDispatcher.hasEventListener(type);
		}

		public bool dispatchEvent(Event e)
		{
			return eventDispatcher.dispatchEvent(e);
		}

		#endregion

		/// <summary>
		/// コンストラクタ
		/// </summary>
		public FormMain()
		{
			InitializeComponent();
			eventDispatcher = new EventDispatcher();
			formConfig = null;
		}

		/// <summary>
		/// フォームがロードされた時
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void FormMain_Load(object sender, EventArgs e)
		{
			Visible = false;

			menuItemVersion.Text = "JoyServer - Ver." +
									getVersionString();

			FormEvent formEvent;
			formEvent = new FormEvent(this, FormEvent.LOAD);
			dispatchEvent(formEvent);
		}

		/// <summary>
		/// Exe ファイルのバージョンを取得する
		/// </summary>
		/// <returns></returns>
		private String getVersionString()
		{
			System.Reflection.Assembly assembly =
				System.Reflection.Assembly.GetExecutingAssembly();

			Version vertion = assembly.GetName().Version;
			return vertion.ToString();
		}

		/// <summary>
		/// フォームが閉じられた時
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
		{
			FormEvent formEvent;
			formEvent = new FormEvent(this, FormEvent.FORM_CLOSING);
			dispatchEvent(formEvent);

			if (formConfig != null && !formConfig.IsDisposed)
			{
				formConfig.Close();
			}
		}

		/// <summary>
		/// メニューから "終了" が選択された時
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void menuItemQuit_Click(object sender, EventArgs e)
		{
			notifyIcon.Visible = false;
			this.Close();
		}

		/// <summary>
		/// メニューから "ジョイスティックの状態" が選択された時
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void menuItemConfig_Click(object sender, EventArgs e)
		{
			if (formConfig == null || formConfig.IsDisposed)
			{
				formConfig = new FormConfig();
			}
			formConfig.Show();
		}

		/// <summary>
		/// タスクバーアイコンがダブルクリックされた時
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void notifyIcon_DoubleClick(object sender, EventArgs e)
		{
			if (formConfig == null || formConfig.IsDisposed)
			{
				formConfig = new FormConfig();
			}
			formConfig.Show();
		}

		/// <summary>
		/// 「インストール先フォルダを開く」がクリックされた時
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void menuItemOpenFolder_Click(object sender, EventArgs e)
		{
			String path = Application.StartupPath + "\\";
			System.Diagnostics.Process.Start(path);
		}

		/// <summary>
		/// 「配布元Webサイトを開く」がクリックされた時
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void menuItemOpenWebSite_Click(object sender, EventArgs e)
		{
			String url = Global.distributionUrl;
			System.Diagnostics.Process.Start(url);
		}
	}
}
